﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using SAAC.DTO;
using System.Data;

namespace SAAC.DAL
{
	public class RequerimentoDAL : DALBase
	{

		public RequerimentoDTO Select(RequerimentoDTO dto, string order = null)
		{
			try
			{
				string sql = "CALL sp_requerimento_sel(@id,@abertura,@fechamento,@status,@comentarios,@funcionarioMatricula,@alunoMatricula,@order,@limit);";

				if (dto.FuncionarioAvaliador == null) dto.FuncionarioAvaliador = new FuncionarioDTO();
				if (dto.AlunoRequerinte == null) dto.AlunoRequerinte = new AlunoDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);
				cmd.Parameters.AddWithValue("@id", dto.Id);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@fechamento", dto.Fechamento);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@comentarios", dto.Comentarios);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioAvaliador.Matricula);
				cmd.Parameters.AddWithValue("@alunoMatricula", dto.AlunoRequerinte.Matricula);
				cmd.Parameters.AddWithValue("@order", order);
				cmd.Parameters.AddWithValue("@limit", 1);

				con.Open();
				MySqlDataReader dr;

				dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

				if (dr.Read())
				{
					dto.Id = Convert.ToInt32(dr["idRequerimento"]);
					dto.Abertura = Convert.ToDateTime(dr["abertura"]);
                    dto.Fechamento = DBNull.Value.Equals(dr["fechamento"]) ? (DateTime?)null : Convert.ToDateTime(dr["fechamento"]);
					dto.Status = (EStatusRequerimento)Convert.ToInt32((dr["status"]));
					dto.Comentarios = dr["comentarios"].ToString();
                    dto.FuncionarioAvaliador.Matricula = DBNull.Value.Equals(dr["Funcionario_matricula"]) ? (Int32?)null : Convert.ToInt32(dr["Funcionario_matricula"]);
					dto.AlunoRequerinte.Matricula = Convert.ToInt32(dr["Aluno_matricula"]);
				}
				else dto = null;

				return dto;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public List<RequerimentoDTO> SelectAll(RequerimentoDTO dto, string order = null, int limit = 1000)
		{
			try
			{
				string sql = "CALL sp_requerimento_sel(@id,@abertura,@fechamento,@status,@comentarios,@funcionarioMatricula,@alunoMatricula,@order,@limit);";

				if (dto.FuncionarioAvaliador == null) dto.FuncionarioAvaliador = new FuncionarioDTO();
				if (dto.AlunoRequerinte == null) dto.AlunoRequerinte = new AlunoDTO();

				var lista = new List<RequerimentoDTO>();

				MySqlCommand cmd = new MySqlCommand(sql, con);
				cmd.Parameters.AddWithValue("@id", dto.Id);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@fechamento", dto.Fechamento);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@comentarios", dto.Comentarios);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioAvaliador.Matricula);
				cmd.Parameters.AddWithValue("@alunoMatricula", dto.AlunoRequerinte.Matricula);
				cmd.Parameters.AddWithValue("@order", order);
				cmd.Parameters.AddWithValue("@limit", limit);

				con.Open();
				MySqlDataReader dr;

				dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

				while (dr.Read())
				{
					var item = new RequerimentoDTO();

					if (item.FuncionarioAvaliador == null) item.FuncionarioAvaliador = new FuncionarioDTO();
					if (item.AlunoRequerinte == null) item.AlunoRequerinte = new AlunoDTO();

					item.Id = Convert.ToInt32(dr["idRequerimento"]);
					item.Abertura = Convert.ToDateTime(dr["abertura"]);
					item.Fechamento = DBNull.Value.Equals(dr["fechamento"]) ? (DateTime?)null : Convert.ToDateTime(dr["fechamento"]);
					item.Status = (EStatusRequerimento)Convert.ToInt32((dr["status"]));
					item.Comentarios = dr["comentarios"].ToString();
					item.FuncionarioAvaliador.Matricula = DBNull.Value.Equals(dr["Funcionario_matricula"]) ? (Int32?)null : Convert.ToInt32(dr["Funcionario_matricula"]);
					item.AlunoRequerinte.Matricula = Convert.ToInt32(dr["Aluno_matricula"]);
					lista.Add(item);
				}

				return lista;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public int Insert(RequerimentoDTO dto)
		{
			try
			{
				String sql = @"CALL sp_requerimento_ins(@abertura,@fechamento,@status,@comentarios,@funcionarioMatricula,@alunoMatricula);";

				if (dto.FuncionarioAvaliador == null) dto.FuncionarioAvaliador = new FuncionarioDTO();
				if (dto.AlunoRequerinte == null) dto.AlunoRequerinte = new AlunoDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@fechamento", dto.Fechamento);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@comentarios", dto.Comentarios);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioAvaliador.Matricula);
				cmd.Parameters.AddWithValue("@alunoMatricula", dto.AlunoRequerinte.Matricula);


                con.Open();
				cmd.ExecuteNonQuery();
                con.Close();

                //-------------------------------------------------------------------------------

                sql = "SELECT MAX(idRequerimento) maxId FROM requerimento";

                cmd = new MySqlCommand(sql, con);

                con.Open();
                MySqlDataReader dr;

                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                
                int item;
                if (dr.Read())
                {
                    item = Convert.ToInt32(dr["maxId"]);
                }
                else
                    item = -1;

                return item;
         
            }
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
               
				con.Close();
               
            }

		}

		public void Update(RequerimentoDTO dto)
		{
			try
			{
				String sql = "CALL sp_requerimento_upd(@id,@abertura,@fechamento,@status,@comentarios,@funcionarioMatricula,@alunoMatricula);";

                if (dto.FuncionarioAvaliador == null) dto.FuncionarioAvaliador = new FuncionarioDTO();
                if (dto.AlunoRequerinte == null) dto.AlunoRequerinte = new AlunoDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@id", dto.Id);
				cmd.Parameters.AddWithValue("@abertura", dto.Abertura);
				cmd.Parameters.AddWithValue("@fechamento", dto.Fechamento);
				cmd.Parameters.AddWithValue("@status", (int?)dto.Status);
				cmd.Parameters.AddWithValue("@comentarios", dto.Comentarios);
				cmd.Parameters.AddWithValue("@funcionarioMatricula", dto.FuncionarioAvaliador.Matricula);
				cmd.Parameters.AddWithValue("@alunoMatricula", dto.AlunoRequerinte.Matricula);

				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Delete(RequerimentoDTO dto)
		{
			try
			{
				String sql = "CALL sp_requerimento_del(@id);";

                if (dto.FuncionarioAvaliador == null) dto.FuncionarioAvaliador = new FuncionarioDTO();
                if (dto.AlunoRequerinte == null) dto.AlunoRequerinte = new AlunoDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@id", dto.Id);
				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

      
	}
}
